package innovacion.dao;

import innovacion.excepcion.DAOExcepcion;
import innovacion.modelo.Idea;
import innovacion.modelo.Usuario;
import innovacion.util.ConexionBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;


public class IdeaDAO extends BaseDAO {

	public void cambiaEstadoPublicado(int ididea) throws DAOExcepcion {
		String query = "Update idea Set estado='P' Where ididea=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, ididea);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Idea actualizarEstado(Idea vo) throws DAOExcepcion {
		String query = "update idea set estado=? where ididea=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getEstado());
			stmt.setInt(2, vo.getIdidea());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Idea obtener(int ididea) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select ididea, titulo, descripcion, estado from idea where estado='C' and ididea=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, ididea);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdidea(rs.getInt(1));
				vo.setTitulo(rs.getString(2));
				vo.setDescripcion(rs.getString(3));
				vo.setEstado(rs.getString(4));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Collection<Idea> buscarIdea(int ididea)
			throws DAOExcepcion {
		String query = "select ididea, idusuario, titulo, descripcion, estado from idea where ididea=?";
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, ididea);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setIdidea(rs.getInt("idusuario"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}
	
	public Collection<Idea> listarPorTitulo(String titulo, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where titulo like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + titulo + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<Idea> listarPorDescripcion(String descripcion, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where descripcion like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + descripcion + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Idea> listarPorPalabraClave01(String clave, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where clave1 like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + clave + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Idea> listarPorPalabraClave02(String clave, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where clave2 like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + clave + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	

	public Collection<Idea> listarPorPalabraClave03(String clave, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where clave3 like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + clave + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	

	public Collection<Idea> listarPorPalabraClave04(String clave, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where clave4 like ? and estado like ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + clave + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	
	public String imprimirHelloWorld() throws DAOExcepcion {
		return("Hello World");
	}
	
	

	
	public Collection<Idea> buscarIdeaFiltro(String cflagdes, String descripcion, String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "";
			String campos = "Select idea.ididea, idea.idusuario, idea.titulo, idea.descripcion, If(idea.clave1 is null, '', idea.clave1) as clave1, If(idea.clave2 is null, '', idea.clave2) as clave2, If(idea.clave3 is null, '', idea.clave3) as clave3, If(idea.clave4 is null, '', idea.clave4) as clave4, if (idea.estado = 'C', 'Creado', if (idea.estado = 'P', 'Publicado', if (idea.estado = 'A', 'Aprobado', 'Rechazado'))) as estado, usuario.nombres, usuario.paterno, usuario.materno, usuario.correo, usuario.direccion, usuario.telefono";
			String tablas = "From idea inner join usuario On idea.idusuario = usuario.idusuario";
			String condicion1 = "";
			String condicion2 = "";
			
			//Filtro 1: Titulo(T), Descripcion(D), Palabra clave(P)
			if (cflagdes.equals("T")) {
				condicion1 = "Where idea.titulo like ? ";
			} else if (cflagdes.equals("D")) {
				condicion1 = "Where idea.descripcion like ? ";
			} else {
				condicion1 = "Where concat(If(clave1 is null, '', clave1), ' ' , If(clave2 is null, '', clave2) , ' ', If(clave3 is null, '', clave3) , ' ', If(clave4 is null, '', clave4)) Like ?";
			}

			//Filtro 2: Publicado(P), Aprobado(A), Rechazado(R), Todos
			condicion2 = "and idea.estado like ?";
			
			//Query Final
			query = campos + " " + tablas + " " +condicion1 +" " + condicion2;
			
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + descripcion + "%");
			stmt.setString(2, "%" + estado + "%");
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				UsuarioDAO us = new UsuarioDAO();
				
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("Clave1"));
				vo.setClave2(rs.getString("Clave2"));
				vo.setClave3(rs.getString("Clave3"));
				vo.setClave4(rs.getString("Clave4"));
				vo.setEstado(rs.getString("Estado"));
				vo.setIdusuario(us.obtener(rs.getInt("idusuario")));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	public Collection<Idea> listarPorTituloPorUsuario(String titulo, String estado, int iduser) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select ididea, titulo, descripcion, clave1, clave2, clave3, clave4, estado from idea where titulo like ? and estado like ? and idusuario=?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + titulo + "%");
			stmt.setString(2, "%" + estado + "%");
			stmt.setInt(3, iduser );
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setIdidea(rs.getInt("ididea"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setClave1(rs.getString("clave1"));
				vo.setClave2(rs.getString("clave2"));
				vo.setClave3(rs.getString("clave3"));
				vo.setClave4(rs.getString("clave4"));
				vo.setEstado(rs.getString("estado"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
}
